/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.bs.analisis.plugin;

import java.util.HashMap;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.bs.analisis.execution.exception.ParameterNotFoundException;

/**
 *
 * @author gbran
 *
 * La clase <code>TemplatePlugin</code> contiene las funcionalidades basicas
 * para el desarrollo de plugins. Utilicela a la vez que implementa la interfaz
 * plugin.
 * 
 */
public abstract class AbstractPlugin {

    private HashMap<String, Object> parameters = new HashMap<String, Object>();

    /**
     * Constructor por default con el mapa de los parametros requeridos por el
     * plugin para completar el procesamiento de log.
     * 
     * @param parameters
     */
    public AbstractPlugin(HashMap<String, Object> parameters) {
        this.parameters = parameters;
    }

    /**
     * Devuelve la lista de parametros utilizados por el plugin para completar
     * el procesamiento de log.
     *
     * @return
     */
    public HashMap<String, Object> getParameters() {
        return parameters;
    }

    /**
     * Establece la lista de parametros a utilizar por el plugin para completar
     * el procesamiento de log.
     *
     * @param parameters
     */
    public void setParameters(HashMap<String, Object> parameters) {
        this.parameters = parameters;
    }

    /**
     * Metodo generico para la obtencion de parametros de la lista de parametros
     * inicial.
     *
     * @param <T>
     * @param parameterName
     * @return
     * @throws ParameterNotFoundException
     */
    public <T> T getParameterValue(String parameterName) throws ParameterNotFoundException {
        if (this.parameters == null) {
            throw new ParameterNotFoundException("La lista de parametros del plugin no ha sido inicializada");
        } else if (!this.parameters.containsKey(parameterName)) {
            throw new ParameterNotFoundException("La lista de parametros del plugin no contiene el objeto solicitado");
        }
        return (T) this.parameters.get(parameterName);
    }

    /**
     * El metodo <code>getBussinesObject()</code> permite desacoplar los plugins
     * de los componentes que proveen recursos para el procesamiento de logs.
     * 
     * Hacer lookup al contexto para obtener una funcionalidad de EJB rompe
     * cualquier dependencia del ejecutor con el plugin lo que garantiza el
     * cumplimiento del patron Command.
     * 
     * @param <T>
     * @param objectName
     * @return
     * @throws NamingException
     */
    public <T> T getBussinesObject(String objectName) throws NamingException {
        Context context = new InitialContext();
        T object = (T) context.lookup(objectName);
        return object;
    }
}
